home *** CD-ROM | disk | FTP | other *** search
/ Skunkware 5 / Skunkware 5.iso / src / X11 / seyon / SeSupp.c < prev    next >
C/C++ Source or Header  |  1995-05-03  |  4KB  |  232 lines

  1. /*
  2.  * This file is part of the Seyon, Copyright (c) 1992-1993 by Muhammad M.
  3.  * Saggaf. All rights reserved.
  4.  *
  5.  * See the file COPYING (1-COPYING) or the manual page seyon(1) for a full
  6.  * statement of rights and permissions for this program.
  7. */
  8.  
  9. /*
  10.     Revisions:
  11.  
  12.     2.2        lg    Now uses /dev/tty instead of stdin/stdout
  13.     2.2        lg    Added command parser
  14. */
  15.  
  16. #include <signal.h>
  17.  
  18. #include <X11/Intrinsic.h>
  19.  
  20. #include "seyon.h"
  21. #include "SeDecl.h"
  22.  
  23. extern FILE    *tfp;        /* Local terminal */
  24. extern int      tfd;        /* Local terminal */
  25.  
  26. char            line[WBSIZE];    /* Input line */
  27. char            word[WBSIZE];    /* Parsed word */
  28. char           *wptr,
  29.                *lptr;        /* Word and line pointers */
  30. int             eof_flag = 0;    /* Indicates EOF during getline() processing */
  31.  
  32. void
  33. sendstr(p)            /* send a string to the port */
  34.      register char  *p;
  35. {
  36.   while (*p)
  37.     sendbyte(*p++);
  38. }
  39.  
  40. /* Convert uppercase characters to lowercase, (without
  41.  * mangling non-uppercase characters), in a portable manner.
  42.  */
  43. int
  44. mklow(c)
  45.      int             c;
  46. {
  47.   if (isupper(c))
  48.     return (tolower(c));
  49.   return (c);
  50. }
  51.  
  52. /*
  53.  * parse the "line" array for a word
  54.  */
  55.  
  56. void
  57. getword()
  58. {
  59.   char           *ptr,
  60.                   quote;
  61.   int             bflag = 0,
  62.                   qflag = 0;
  63.   int             nflag = 0;
  64.  
  65.   ptr = word;
  66.  
  67.   *ptr = '\0';
  68.   if (eof_flag || *lptr == '\0')
  69.     return;
  70.  
  71.   while (isspace(*lptr))
  72.     lptr++;
  73.  
  74.   wptr = lptr;
  75.  
  76.   if (*lptr == '\0')
  77.     return;
  78.  
  79.   if (*lptr == '\'' || *lptr == '\"')
  80.     quote = *lptr++;
  81.   else
  82.     quote = '\0';
  83.  
  84.   for (; *lptr != '\0'; lptr++) {
  85.     if (quote) {
  86.       if (*lptr == '\0') {
  87.         word[0] = '\0';
  88.         fprintf(tfp, "Unmatched quote: %s\r\n", line);
  89.         eof_flag = 1;
  90.         return;
  91.       }
  92.       if (*lptr == quote)
  93.         break;
  94.     }
  95.     else if (!qflag && isspace(*lptr))
  96.       break;
  97.  
  98.     if (bflag)
  99.       *ptr++ = *lptr & 0x1f;
  100.     else if (qflag)
  101.       *ptr++ = *lptr;
  102.     else if (*lptr == '^')
  103.       bflag = 1;
  104.     else if (*lptr == '\\')
  105.       qflag = 1;
  106.     else
  107.       *ptr++ = *lptr;
  108.  
  109.     if (nflag == 1) {
  110.       nflag = 0;
  111.       bflag = 0;
  112.       qflag = 0;
  113.     }
  114.  
  115.     if (bflag == 1 || qflag == 1)
  116.       nflag = 1;
  117.   }
  118.  
  119.   if (*lptr)
  120.     lptr++;
  121.   *ptr = '\0';
  122. }
  123.  
  124. void
  125. GetWord(lin, wrd)
  126.      char           *lin,
  127.                     *wrd;
  128. {
  129.   char           *ptr;
  130.   int             cc = 0xff;
  131.   int             quote = 0;
  132.  
  133.   ptr = wrd;
  134.   lptr = lin;
  135.  
  136.   *ptr = '\0';
  137.   if (*lptr == '\0')
  138.     return;
  139.  
  140.   while (isspace(*lptr))
  141.     lptr++;
  142.  
  143.   wptr = lptr;
  144.  
  145.   if (*lptr == '\0')
  146.     return;
  147.  
  148.   if (*lptr == '\"') {
  149.     lptr++;
  150.     quote = 1;
  151.   }
  152.  
  153.   while (*lptr && (quote || !isspace(*lptr)) && (!quote || *lptr != '\"')) {
  154.     
  155.     if (*lptr == '^' && *(lptr + 1) && (!quote || *(lptr + 1) != '\"')) {
  156.       lptr++;
  157.       if (*lptr != '^')
  158.         cc = 0x1f;
  159.     }
  160.     *ptr++ = *lptr & cc;
  161.     lptr++;
  162.     cc = 0xff;
  163.   }
  164.  
  165.   if (*lptr)
  166.     lptr++;;
  167.   *ptr = '\0';
  168. }
  169.  
  170. char*
  171. NextWord(newLinePtr)
  172.      char *newLinePtr;
  173. {
  174.   static char nextWord[LRG_BUF], *linePtr;
  175.  
  176.   if (newLinePtr) linePtr = newLinePtr;
  177.   GetWord(linePtr, nextWord);
  178.   linePtr = lptr;
  179.   return nextWord;
  180. }
  181.  
  182. /*
  183.  * make the specified word all lower case
  184.  */
  185.  
  186. void
  187. lc_word(ptr)
  188.      char           *ptr;
  189. {
  190.   while (*ptr) {
  191.     *ptr = mklow(*ptr);
  192.     ptr++;
  193.   }
  194. }
  195.  
  196. /*
  197.  * input a line from the specified file
  198.  */
  199.  
  200. void
  201. getline(fp)
  202.      FILE           *fp;
  203. {
  204.   int             l;
  205.  
  206.   memset(line, 0, WBSIZE);
  207.  
  208.   if ((fgets((lptr = line), WBSIZE, fp)) == NULL) {
  209.     eof_flag = 1;
  210.     line[0] = '\0';
  211.   }
  212.  
  213.   l = strlen(line);           /* Purge newline if found */
  214.   if (l--) {
  215.     if (line[l] == '\n')
  216.       line[l] = '\0';
  217.   }
  218. }
  219.  
  220. void
  221. set_tty_mode()
  222. {
  223.   io_set_attr(tfd, &newmode);
  224. }
  225.  
  226. void
  227. restore_orig_mode()
  228. {
  229.   io_set_attr(tfd, &oldmode);
  230. }
  231.  
  232.